import random
import time
from faker import Faker
from datetime import datetime,timedelta
import json
import pandas as pd


#   初始化Faker对象,faker默认是生成英文的名字，所以需要生成中文的话就需要实例一个中文的Faker    在括号里面加上'zh_CN'就是了
fake=Faker('zh_CN')

#   定义商品id的范围   radius:范围       range(390)其实就是0-389
shop_id_radius=range(700)

#   省份集合
province_list = [
    '北京', '天津', '河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江',
    '上海', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南',
    '湖北', '湖南', '广东', '广西', '海南', '重庆', '四川', '贵州',
    '云南', '西藏', '陕西', '甘肃', '青海', '宁夏', '新疆', '香港',
    '澳门', '台湾'
]

#   模拟用户id和名称生成             counter:计数器
user_id_counter=1               #   用户id从1开始

#   用于生成用户id和用户姓名,还有发往的省份的函数
#   random.choice()从给定的集合或者序列里面随机返回一个
#   fake.last_name():随机生成一个中文里面的姓氏
#   fake.first():随机生成
def create_user_id_and_name():
    global user_id_counter                   # 声明使用全局变量,所以下面对user_id_counter的操作都是对全局变量的操作
    user_id=user_id_counter
    user_name=fake.name()
    province = random.choice(province_list)  # 随机生成省份
    user_id_counter +=1
    return user_id,user_name,province


#   定义一个随机打分的函数
def get_rating():
    rating_list=['未作评价','1.0','2.0','3.0','4.0','5.0']
    return random.choice(rating_list)

#   用于生成购买商品数据的函数
def create_buy_shop_data(user_id,user_name,province):
    product_id=random.choice(shop_id_radius)            #   随机选择商品id
    buy_number=random.randint(0,6)                      #   随机生成购买数量1-100
    buy_time=create_time()
    rating=get_rating()                                  #  得到购买后的评分
    #   随机生成最近三个月内的时间
    return{
        'user_id':user_id,
        'user_name':user_name,
        'product_id':product_id,
        'buy_number':buy_number,
        'province':province,
        'buy_time':buy_time,
        'rating':rating
    }


#   生成随机时间，购买时间必须小于当前的时间
#   random.randint(0,3600*24*90)：从90天的时间里面随机拿一个，到时候作为与当前时间的间隔
#   timedelta(seconds=delta):timedelta是time提供的一个表示时间差的函数，里面可以指定秒数或者小时，分钟，形成一个与当前时间有时间
#   差的值
"""
%Y：四位数的年份（例如 2024）。
%m：两位数的月份（01 到 12）。
%d：两位数的日期（01 到 31）。
%H：两位数的小时（00 到 23）。
%M：两位数的分钟（00 到 59）。
%S：两位数的秒（00 到 59）。
"""
def create_time():
    current_time=datetime.now()
    delta=random.randint(0,3600*24*90)              #   随机时间间隔，最大90天    这里的3600是每个小时的秒数
    buy_time=current_time - timedelta(seconds=delta)
    return buy_time.strftime('%Y-%m-%d %H:%M:%S')               #  将时间格式化

#   生成批量购买记录        batch:批量
def create_more_data(batch_size=1000):
    data=[]
    for _ in range(batch_size):         #   这种用法表示不关系_变量的值，只是用来循环batch_size-1的次数
        user_id,user_name,province=create_user_id_and_name()
        buy_count=random.randint(2,11)              #   每个用户购买2-10次商品
        for _ in range(buy_count):
            row=create_buy_shop_data(user_id,user_name,province)
            data.append(row)
    return data



#   实时生成数据的函数 real time:实时
def create_real_time_data(count,batch_size=10000,interval=1):
    for _ in range(count):
        data=create_more_data(batch_size)
        #   将数据写入文件
        dataframe_data=pd.DataFrame(data)
        dataframe_data.to_csv('user_buy_info.csv',mode='a',index=False)
        #   模拟实时生成的数据，间隔为1秒
        time.sleep(2)
    print("数据生成完毕")


#   主程序入口，启动实时数据
if __name__=='__main__':
    #   循环10次，每次是10000条数据
    create_real_time_data(2,batch_size=10000,interval=1)

        











